#define _CRT_SECURE_NO_WARNINGS
#define SIZE_ARR(arr) (sizeof(arr) / sizeof(arr[0]))
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 此函数内部没有进行打印，因此需要对原数组进行更改，不能仅对副本进行操作，所以使用传入传出参数
void reverse_arr(int* arr, int len) {
	int* start = arr;
	int* end = arr + len - 1;
	int tmp = 0;
	while (start < end) {
		tmp = *start;
		*start = *end;
		*end = tmp;
		start++;
		end--;
	}
} 

void reverse_string(char * str) {
	int len = strlen(str);
	// 使用一个临时字符串数组来保存字符串字面值的内容
	// char arr[len + 1]; // C99标准及以后版本的C语言中才能这样使用
	char* arr = (char*)malloc((len + 1) * sizeof(char)); // 动态分配内存，+1是保存'\0'
	strcpy(arr, str);
	char* start = arr;
	char* end = arr + len - 1;
	char tmp;
	while (start < end) {
		tmp = *start;
		*start = *end;
		*end = tmp;
		start++;
		end--;
	}

	printf("%s\n", arr);
}

void reverse_list() {

}

int main() {
	int arr[] = { 1,2,3,4,5 };
	int arr_len = SIZE_ARR(arr);
	reverse_arr(arr, arr_len);
	for (int i = 0; i < arr_len; i++)
		printf("%d ", arr[i]);

	// char* str = "hello world!"; // 字符串字面值是只读的，不能直接修改
	// 只有使用字符数组来存储字符串内容时才可以交换和修改字符串内容
	// 因为它存储在堆栈上，而不是只读内存区域
	char str[] = "hello world!";
	reverse_string(str);

    return 0;
}